home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / net / bind-contrib.tar.gz / bind-contrib.tar / contrib / misc / reload / text0002.txt < prev    next >
Encoding:
Text File  |  1996-10-25  |  3.0 KB  |  148 lines

  1. #include <signal.h>
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include "../conf/options.h"
  5.  
  6.  
  7. #define EXECCHECK if (getuid() != 0) {fprintf(stderr,"root only\n");exit(1);}
  8. #define RUNNINGCHECK if (!running) {fprintf(stderr,"named not running\n"); continue;}
  9. #ifdef ROOTONLY
  10. #define ROOTCHECK EXECCHECK
  11. #else
  12. #define ROOTCHECK
  13. #endif
  14.  
  15. extern char **environ;
  16.  
  17. char *newenv[] =
  18.     {
  19.     "PATH=/bin",
  20.     "HOME=/",
  21.     0
  22.     };
  23.  
  24. main(argc,argv)
  25. int  argc;
  26. char **argv;
  27. {
  28.     FILE* f;
  29.     unsigned long i = 0;
  30.     unsigned long s;
  31.     int running = 0;
  32.  
  33.     f = fopen(_PATH_PIDFILE,"r");
  34.  
  35.     if (f) {
  36.         if (fscanf(f,"%u",&i) == 1) {
  37.         if (kill(i,0) == -1) {
  38.             switch(errno) {
  39.             case EPERM:
  40.             running = 1;
  41.             break;
  42.             }
  43.         } else {
  44.             running = 1;
  45.         }
  46.         }
  47.         fclose(f);
  48.     }
  49.  
  50.     s = SIGHUP;
  51.     while ( argc-- > 1 ) {
  52.  
  53.         argv++;
  54.         if ( ! strcmp(argv[0],"status")) {
  55.             fprintf(stderr,"reload: named is%srunning\n",
  56.                 running? " ":" not ");
  57.             continue;
  58.         } else if ( ! strcmp(argv[0],"dumpdb") ) {
  59.             ROOTCHECK
  60.             RUNNINGCHECK
  61.             fprintf(stderr,"reload: dumping database\n");
  62.             s = SIGINT;
  63.         } else if ( ! strcmp(argv[0],"reload") ) {
  64.             RUNNINGCHECK
  65.             fprintf(stderr,"reload: reloading database\n");
  66.             s = SIGHUP;
  67.         } else if ( ! strcmp(argv[0],"stats") ) {
  68.             ROOTCHECK
  69.             RUNNINGCHECK
  70.             fprintf(stderr,"reload: dumping stats\n");
  71.             s = SIGIOT;
  72.         } else if ( ! strcmp(argv[0],"trace") ) {
  73.             ROOTCHECK
  74.             RUNNINGCHECK
  75.             fprintf(stderr,"reload: tracing on\n");
  76. #if defined(SIGUSR1) && defined(SIGUSR2)
  77.             s = SIGUSR1;
  78. #else
  79.             s = SIGEMT;
  80. #endif
  81.         } else if ( ! strcmp(argv[0],"notrace") ) {
  82.             ROOTCHECK
  83.             RUNNINGCHECK
  84.             fprintf(stderr,"reload: turning tracing off\n");
  85. #if defined(SIGUSR1) && defined(SIGUSR2)
  86.             s = SIGUSR2;
  87. #else
  88.             s = SIGFPE;
  89. #endif
  90. #if defined(SIGWINCH) && defined(QRYLOG)
  91.         } else if ( ! strcmp(argv[0],"querylog") ) {
  92.             ROOTCHECK
  93.             RUNNINGCHECK
  94.             fprintf(stderr,"reload: querylog toggled\n");
  95.             s = SIGWINCH;
  96. #endif
  97.         } else if ( ! strcmp(argv[0],"stop") ) {
  98.             EXECCHECK
  99.             fprintf(stderr,"reload: stopping named\n");
  100.             s = SIGTERM;
  101.         } else if ( ! strcmp(argv[0],"restart") ) {
  102.             EXECCHECK
  103.             if (running) {
  104.                 s = SIGTERM;
  105.                 if (kill(i,s)) {
  106.                 perror("reload: kill");
  107.                 fprintf(stderr,"reload: named NOT restarted\n");
  108.                 exit(1);
  109.                 }
  110.             }
  111.             setuid(geteuid());
  112.             environ = newenv;
  113.             argv[0] = "named";
  114.             execv(NAMED, argv);
  115.             perror("execv");
  116.             exit(1);
  117.         } else if ( ! strcmp(argv[0],"start") ) {
  118.             EXECCHECK
  119.             if (running) {
  120.                 fprintf(stderr,"named already running\n");
  121.                 continue;
  122.             }
  123.             setuid(geteuid());
  124.             environ = newenv;
  125.             argv[0] = "named";
  126.             execv(NAMED, argv);
  127.             perror("execv");
  128.             exit(1);
  129.         } else {
  130.             fprintf(stderr,"unknown switch \"%s\"\n",argv[0]);
  131.             fprintf(stderr, "Usage: reload %s ...\n",
  132. #if defined(SIGWINCH) && defined(QRYLOG)
  133.  
  134. "(status|dumpdb|reload|stats|trace|notrace|querylog|start|stop|restart)"
  135. #else
  136. "(status|dumpdb|reload|stats|trace|notrace|start|stop|restart)"
  137. #endif
  138.                 );
  139.             continue;
  140.         }
  141.         if (kill(i,s)) {
  142.             perror("reload: kill");
  143.         }
  144.     }
  145.     exit(0);
  146. }
  147.  
  148.